/*
 * Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @assertion A compound assignment of the form v op= e is equivalent to v=v op e.
 * @description Checks that an expression of the form v /= e is equivalent to v = v / e.
 * @author msyabro
 * @reviewer rodionov
 */
import "../../../Utils/expect.dart";

class C {
  C(this.v);
  
  operator/(val) {
    C c = new C(v / val);
    return c;
  }

  var v;
}

class A {
  A(val) {
    _c = new C(val);
    getterInvocation = 0;
    setterInvocation = 0;
  }
  
  get c {
    ++getterInvocation;
    return _c;
  }
  
  set c(val) {
    ++setterInvocation;
    _c = val;
  }

  test(val, expected) {
    var res = (c /= val);
    Expect.equals(1, getterInvocation);     //checks that getter was invoked only one time
    Expect.equals(1, setterInvocation);     //checks that setter was invoked only one time
    Expect.equals(expected, c.v);           //checks that result was assigned
    Expect.equals(expected, res.v);         //checks result
  }

  C _c;

  int getterInvocation;
  int setterInvocation;
}

main() {
  new A(3).test(3, 3 / 3);
  new A(10).test(1, 10 / 1);
  new A(0.5).test(7, 0.5 / 7);
  new A(-2).test(1, -2 / 1);
}
